package cl.tinet.reservaCD;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import javax.faces.model.SelectItem;

import cl.tinet.reservaCD.exception.UsuarioExisteException;
import cl.tinet.reservaCD.exception.UsuarioNoExisteException;
import cl.tinet.reservaCD.exception.UsuarioPassworIncorrectaException;
import cl.tinet.reservaCD.modelo.Usuario;
import cl.tinet.reservaCD.usuario.UsuarioBean;
import cl.tinet.reservaCD.util.MD5;

/**
 * Managed Bean del usuario.
 * 
 * @author Carlos Duque
 * 
 */
@ManagedBean
@SessionScoped
public class UsuarioMB implements Serializable {

    /**
     * Serial de la clase.
     */
    private static final long serialVersionUID = 1L;

    /**
     * Instancia de Usuario.
     */
    private Usuario usuario;

    /**
     * Lista con los usuarios.
     */
    private List<Usuario> usuarios;

    /**
     * Instancia de bean Usuario.
     */
    @EJB(mappedName = "beanUsuario", name = "beanUsuario")
    private transient UsuarioBean bean;

    /**
     * Instanciador de nuevo Entity Manager .
     */
    @PostConstruct
    public void init() {
        if (usuario == null) {
            usuario = new Usuario();
        }
    }

    /**
     * 
     * Metodo get del usuario.
     * 
     * @return usuario.
     */
    public Usuario getUsuario() {
        return usuario;
    }

    /**
     * Metodo set del usuario.
     * 
     * @param usuario
     *            usuario.
     */
    public void setUsuario(Usuario usuario) {
        this.usuario = usuario;
    }

    /**
     * Metodo agregar Usuario MG.
     * 
     * @return a la pagina que se va a dirigir.
     */
    public String agregarUsuarioMG() {

        FacesContext context = FacesContext.getCurrentInstance();

        try {
            MD5 md5 = new MD5();
            usuario.setPassword(md5.getMD5(usuario.getPassword()));
            bean.crearUsuario(usuario);
        } catch (UsuarioExisteException e) {
            context.addMessage(null, new FacesMessage("Successful", "Mensaje: "
                    + e.getMessage()));
        }
        return "usuarioAdministrador";
    }

    /**
     * Metodo borrar un usuario MG.
     * 
     * @return a la pagina que se va a dirigir.
     */
    public String borrarUsuarioMG() {
        FacesContext context = FacesContext.getCurrentInstance();

        try {
            bean.eliminarUsuario(usuario);
        } catch (UsuarioNoExisteException e) {
            context.addMessage(null, new FacesMessage("Successful", "Mensaje: "
                    + e.getMessage()));
        }
        return "usuario";
    }

    /**
     * Metodo para actualizar el usuario.
     * 
     * @return la pagina quese va a dirigir.
     */
    public String actualizarUsuarioMG() {
        FacesContext context = FacesContext.getCurrentInstance();
        try {
            bean.actualizarUsuario(usuario);
        } catch (UsuarioNoExisteException e) {
            context.addMessage(null, new FacesMessage("Successful", "Mensaje: "
                    + e.getMessage()));
        }

        return "usuario";
    }

    /**
     * Metodo que retorna la lista de los usuarios.
     * 
     * @return lista con los usuarios de la base de datos
     */
    public List<Usuario> listarUsuarioMG() {
        usuarios = bean.listaUsuario();
        return usuarios;
    }

    /**
     * Metodo que valida el login en el MG.
     * 
     * @return la pagina quese va a dirigir.
     * @return
     * @throws UsuarioException
     *             si el usuario no existe.
     */
    public String validarUsuario() {
        FacesContext context = FacesContext.getCurrentInstance();

        String pagina = "";
        try {
            MD5 md5 = new MD5();
            usuario.setPassword(md5.getMD5(usuario.getPassword()));

            // valida el nombre de usuario.
            if (bean.buscarUsuario(usuario) != null) {
                // Valida el nombre y la clave.
                if (bean.validarUsuario(usuario) != null) {
                    // valida si el tipo es administrador
                    Usuario usuarioTipo = bean.validarUsuario(usuario);
                    if (usuarioTipo.getTipoUsuario().equals("administrador")) {
                        pagina = "usuarioAdministrador";
                    }
                    // valida si el tipo es normal
                    if (usuarioTipo.getTipoUsuario().equals("normal")) {
                        pagina = "usuarioNormal";
                    }
                }
            }
        } catch (UsuarioPassworIncorrectaException e) {
            context.addMessage(null,
                    new FacesMessage("Mensaje: " + e.getMessage()));
        }

        return pagina;
    }

    /**
     * Metodo que carga el grip.
     * 
     * @param usuarioBusqueda
     *            usuario a cargar en el pop up
     * @throws UsuarioException
     *             no existe usuario.
     */
    public void mostrarBorrarUsuario(Usuario usuarioBusqueda) {

        this.usuario = bean.buscarUsuario(usuarioBusqueda);
        org.primefaces.context.RequestContext.getCurrentInstance().update(
                "formBorrar:gridBorrar");
        org.primefaces.context.RequestContext.getCurrentInstance().execute(
                "PF('dialogoBorrarUsuario').show()");

    }

    /**
     * Metodo que carga el grip.
     * 
     * @param usuarioBusqueda
     *            usuario a cargar en el pop up
     * @throws UsuarioException
     *             no existe usuario.
     */
    public void mostrarActualizarUsuario(Usuario usuarioBusqueda) {

        this.usuario = bean.buscarUsuario(usuarioBusqueda);
        org.primefaces.context.RequestContext.getCurrentInstance().update(
                "formActualizar:gridActualizar");
        org.primefaces.context.RequestContext.getCurrentInstance().execute(
                "PF('dialogoActualizarUsuario').show()");

    }

    /**
     * Metodo que carga el select Items.
     * 
     * @return items
     */
    public List<SelectItem> getCargarUsuarios() {

        List<SelectItem> items = new ArrayList<SelectItem>();
        List<Usuario> salaList = bean.listaUsuario();

        for (Usuario usuarioo : salaList) {
            items.add(new SelectItem(usuarioo.getNombreUsuario(), usuarioo
                    .getNombreUsuario()));
        }
        return items;
    }

}
